home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 January: Mac OS SDK / Dev.CD Jan 99 SDK1.toast / Development Kits / AppleScript / Development Tools / Sample Code / 7Edit 3.1 / Sources / SVAECoercions.c < prev    next >
Encoding:
Text File  |  1995-11-20  |  3.9 KB  |  126 lines  |  [TEXT/CWIE]

  1. // SVAECoercions.c
  2. //
  3. // 7Edit 3.1d1. Original version by Jon Lansdell and Nigel Humphreys.
  4. // 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1995, all rights reserved.
  6.  
  7. #include "SVAECoercions.h"
  8.  
  9. #include "SVEditAEUtils.h"
  10. #include "SVAETextUtils.h"
  11.  
  12. #include "SVAEAccessors.h"
  13. #include "SVAESelect.h"
  14. #include "SVToken.h"
  15.  
  16.  
  17. #pragma segment AppleEvent
  18.  
  19. // Install coercion handlers that coerce a descriptor from one type to another.
  20.  
  21. OSErr    InstallCoercions(void)
  22. {
  23.     OSErr    err;
  24.  
  25.       err = AEInstallCoercionHandler(typeObjectSpecifier, typeMyAppl,      (AECoercionHandlerUPP)NewAECoerceDescProc(CoerceObjToAnything), 0, true, false);
  26.     err = AEInstallCoercionHandler(typeObjectSpecifier, typeMyWndw,      (AECoercionHandlerUPP)NewAECoerceDescProc(CoerceObjToAnything), 0, true, false);
  27.       err = AEInstallCoercionHandler(typeObjectSpecifier, typeMyText,      (AECoercionHandlerUPP)NewAECoerceDescProc(CoerceObjToAnything), 0, true, false);
  28.       err = AEInstallCoercionHandler(typeObjectSpecifier, typeMyTextProp,  (AECoercionHandlerUPP)NewAECoerceDescProc(CoerceObjToAnything), 0, true, false);
  29.       err = AEInstallCoercionHandler(typeObjectSpecifier, typeMyWindowProp,(AECoercionHandlerUPP)NewAECoerceDescProc(CoerceObjToAnything), 0, true, false);
  30.       err = AEInstallCoercionHandler(typeObjectSpecifier, typeMyApplProp,  (AECoercionHandlerUPP)NewAECoerceDescProc(CoerceObjToAnything), 0, true, false);
  31.  
  32.       err = AEInstallCoercionHandler(typeMyWndw, typeMyText,  (AECoercionHandlerUPP)NewAECoerceDescProc(CoerceWindowToText), 0, true, false);
  33.       err = AEInstallCoercionHandler(typeMyWindowProp, typeMyText,  (AECoercionHandlerUPP)NewAECoerceDescProc(CoerceWindowPropertyToText), 0, true, false);
  34.  
  35.     return(err);
  36. }
  37.  
  38.  
  39. // Takes an object specifier that it resolves using AEResolve
  40. // then tries to coerce this result into the type specified by toType.
  41.  
  42. pascal OSErr    CoerceObjToAnything(const AEDesc    *theAEDesc,
  43.                                     DescType        toType,
  44.                                     long            handlerRefCon,
  45.                                     AEDesc            *result)
  46. {
  47. #pragma unused (handlerRefCon)
  48.  
  49.     AEDesc     objDesc = {typeNull, NULL};
  50.     OSErr      err;    
  51.     
  52.     if (theAEDesc->descriptorType != typeObjectSpecifier)
  53.         return(errAEWrongDataType);
  54.     
  55.         // resolve the object specifier
  56.     err = AEResolve(theAEDesc, kAEIDoMinimum, &objDesc);
  57.     if (noErr != err) goto done;
  58.         
  59.         // hopefully it's the right type by now, but we'll give it a nudge
  60.     err = AECoerceDesc(&objDesc, toType, result);
  61.  
  62. done:
  63.     if (objDesc.dataHandle)
  64.         AEDisposeDesc(&objDesc);
  65.             
  66.     return(err);
  67. }    // CoerceObjToAnything
  68.  
  69.  
  70. // A window is effectively a text item that contains all the text in the window
  71. // so allow coercion of windows to text.
  72.  
  73. pascal OSErr    CoerceWindowToText(AEDesc    *theAEDesc,
  74.                                     DescType        toType,
  75.                                     long            handlerRefCon,
  76.                                     AEDesc            *result)
  77. {
  78. #pragma unused (toType, handlerRefCon)
  79.     
  80.     return(TextDescFromWindowDesc(theAEDesc, result));
  81. }
  82.  
  83. // Some window properties are effectively text so allow a coercion
  84. // e.g. set selection of window 1 to "Something"
  85.  
  86. pascal OSErr    CoerceWindowPropertyToText(AEDesc        *theAEDesc,
  87.                                             DescType    toType,
  88.                                             long        handlerRefCon,
  89.                                             AEDesc        *result)
  90. {
  91. #pragma unused (toType, handlerRefCon)
  92.     
  93.     WindowPropToken        aWindowPropToken;
  94.     TextToken            aTextToken;
  95.     Size                actualSize;
  96.     short                ignore;
  97.     OSErr                err;
  98.  
  99.     GetRawDataFromDescriptor(theAEDesc, (Ptr)&aWindowPropToken,
  100.                                         sizeof(aWindowPropToken), &actualSize);
  101.     
  102.     switch (aWindowPropToken.tokenProperty)
  103.     {
  104.         case pText:
  105.         case pContents:
  106.             err = TextDescFromWindowToken(&(aWindowPropToken.tokenWindowToken), result);
  107.             break;
  108.  
  109.         case pSelection:
  110.             err = GetWindowSelection(aWindowPropToken.tokenWindowToken.tokenWindow,
  111.                                                                     &aTextToken, &ignore);
  112.             if (noErr != err) goto done;
  113.             
  114.             err = AECreateDesc(typeMyText, (Ptr)&aTextToken, sizeof(aTextToken), result);
  115.             break;
  116.             
  117.         default:            // Most properties don't make sense to be coerced from
  118.             err = errAECoercionFail;
  119.     }                        // e.g 'select insertion point before bounds of document 1'
  120.     
  121. done:    
  122.     return(err);
  123. }
  124.  
  125.  
  126.